package bsh;

import org.junit.experimental.categories.Category;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;

import java.util.Iterator;
import java.util.List;

public class FilteredTestRunner extends BlockJUnit4ClassRunner {


	public FilteredTestRunner(final Class<?> klass) throws InitializationError {
		super(klass);
	}


	@Override
	protected List<FrameworkMethod> getChildren() {
		final List<FrameworkMethod> children = super.getChildren();
		final Iterator<FrameworkMethod> iterator = children.iterator();
		while (iterator.hasNext()) {
			final FrameworkMethod child = iterator.next();
			final Category category = child.getAnnotation(Category.class);
			if (category != null) {
				final Class<?>[] value = category.value();
				for (final Class<?> categoryClass : value) {
					if (TestFilter.class.isAssignableFrom(categoryClass)) {
						try {
							final TestFilter testFilter = (TestFilter) categoryClass.newInstance();
							if (testFilter.skip()) {
								System.out.println("skipping test " + child.getMethod() + " due filter " + categoryClass.getSimpleName());
								iterator.remove();
								break;
							}
						} catch (final InstantiationException e) {
							throw new AssertionError(e);
						} catch (final IllegalAccessException e) {
							throw new AssertionError(e);
						}
					}
				}
			}
		}
		return children;
	}
}
